﻿using System;
using System.Collections.Generic;
using System.Text;
using ITAP.Core.Modelling.Primitives;

namespace ITAP.ShprossesBuilder.Modelling.Components
{
    public class ConnectionProvider
    {
        public static bool Connect(IComponent fstComponent, IComponent secComponent)
        {
            if (fstComponent == null || secComponent == null)
                return false;

            IComponent fstComponentToConnect = fstComponent.ConnectTo(secComponent);
            if (fstComponentToConnect == null)
                return false;

            IComponent secComponentToConnect = secComponent.ConnectTo(fstComponentToConnect);
            if (secComponentToConnect == null)
            {
                // Нужно отконнектить от первого компонента второй, т.к. он успешно приконнектился.
                // TODO Проверить дисконнект при неудачном коннекте второго компонента
                fstComponentToConnect.DisconnectFrom(secComponent);
                return false;
            }

            return true;
        }

        public static bool Disconnect(IComponent fstComponent, IComponent secComponent)
        {
            if (fstComponent == null || secComponent == null)
                return true;

            IComponent fstComponentToDisconnect = fstComponent.DisconnectFrom(secComponent);
            if (fstComponentToDisconnect == null)
                return false;

            IComponent secComponentToDisconnect = secComponent.DisconnectFrom(fstComponentToDisconnect);
            if (secComponentToDisconnect == null)
            {
                // Пока не знаю, что делать в этом случае... Типа, один от другого отцепился, а второй не может...
                // Ситуация странная.
                //throw new Exception();
                return false;
            }

            return true;
        }

        public static bool Connect(IEndedComponent fstComponent, IComponent secComponent, EndType fstComponentEndType)
        {
            if (fstComponent == null || secComponent == null)
                return false;

            IComponent fstComponentToConnect = fstComponent.ConnectTo(secComponent, fstComponentEndType);
            if (fstComponentToConnect == null)
                return false;

            IComponent secComponentToConnect = null;
            secComponentToConnect = secComponent.ConnectToEnded((IEndedComponent)fstComponentToConnect, fstComponentEndType);

            if (secComponentToConnect == null)
            {
                // Нужно отконнектить от первого компонента второй, т.к. он успешно приконнектился.
                // TODO Проверить дисконнект при неудачном коннекте второго компонента
                fstComponentToConnect.DisconnectFrom(secComponent);
                return false;
            }

            return true;

        }

        public static bool Connect(IEndedComponent fstComponent, IEndedComponent secComponent, EndType fstComponentEndType, EndType secComponentEndType)
        {
            if (fstComponent == null || secComponent == null)
                return false;

            IComponent fstComponentToConnect = fstComponent.ConnectTo(secComponent, fstComponentEndType);
            if (fstComponentToConnect == null)
                return false;

            IComponent secComponentToConnect = secComponent.ConnectTo(fstComponentToConnect, secComponentEndType);
            if (secComponentToConnect == null)
            {
                // Нужно отконнектить от первого компонента второй, т.к. он успешно приконнектился.
                // TODO Проверить дисконнект при неудачном коннекте второго компонента
                fstComponentToConnect.DisconnectFrom(secComponent);
                return false;
            }

            return true;

        }
    }
}
